//给你一个整数 n ，对于 0 <= i <= n 中的每个 i ，计算其二进制表示中 1 的个数 ，返回一个长度为 n + 1 的数组 ans 作为答案。
//
//
//
//
//
//
// 示例 1：
//
//
//
//
//输入：n = 2
//输出：[0,1,1]
//解释：
//0 --> 0
//1 --> 1
//2 --> 10
//
//
// 示例 2：
//
//
//输入：n = 5
//输出：[0,1,1,2,1,2]
//解释：
//0 --> 0
//1 --> 1
//2 --> 10
//3 --> 11
//4 --> 100
//5 --> 101
//
//
//
//
// 提示：
//
//
// 0 <= n <= 10⁵
//
//
//
//
// 进阶：
//
//
// 很容易就能实现时间复杂度为 O(n log n) 的解决方案，你可以在线性时间复杂度 O(n) 内用一趟扫描解决此问题吗？
// 你能不使用任何内置函数解决此问题吗？（如，C++ 中的 __builtin_popcount ）
//
//
// Related Topics 位运算 动态规划 👍 1295 👎 0

package leetcode.editor.cn;
//java:比特位计数
public class Q0338CountingBits {
    public static void main(String[] args){
        Solution solution = new Q0338CountingBits().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int[] countBits(int n) {
         int[] bits = new int[n + 1];
        for (int i = 0; i < n + 1; i++) {
            bits[i] = countOnes(i);
        }
        return bits;
    }

    public int countOnes(int n) {
        int count = 0;
        while (n > 0) {
//            if (n % 2 != 0) count++;
//            n = n >> 1;
            // 另一种解法
            // 将n的最后一位为1的置为0，置了多少次，就是有多少个1
            n = n & (n - 1);
            count++;
        }

        return count;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}